#pragma once

#include "XamlNode.h"
#include "XamlLineInfo.h"

class XamlBinaryMetadataStore;
class XamlReader;
class XamlNode;

class XamlBinaryFormatWriter
{
private: 
	XamlBinaryFormatWriter(const xshared_ptr<XamlBinaryMetadataStore> & spBinaryMetadataStore, struct IPALStream * pMetadataStream, struct IPALStream * pNodeStreamStream);
public: 
	static HRESULT Create(const xshared_ptr<XamlBinaryMetadataStore> & spBinaryMetadataStore, struct IPALStream * pMetadataStream, struct IPALStream * pNodeStreamStream, xshared_ptr<XamlBinaryFormatWriter> & spXamlBinaryFormatWriter);
	virtual ~XamlBinaryFormatWriter();
	HRESULT WriteAllNodes(const xshared_ptr<XamlReader> & spReader);
private: 
	HRESULT SaveNodeType(enum XamlNode::XamlNodeType nodeType);
	HRESULT PersistNode(const XamlNode & xamlNode);
	HRESULT PersistLineInfoIfNeeded(const XamlNode & xamlNode);
	HRESULT PersistAddNamespaceNode(const XamlNode & xamlNode);
	HRESULT PersistStartObjectNode(const XamlNode & xamlNode);
	HRESULT PersistEndObjectNode(const XamlNode & xamlNode);
	HRESULT PersistStartMemberNode(const XamlNode & xamlNode);
	HRESULT PersistEndMemberNode(const XamlNode & xamlNode);
	HRESULT PersistEndOfAttributesNode(const XamlNode &);
	HRESULT PersistEndOfStreamNode(const XamlNode & xamlNode);
	HRESULT PersistTextValueNode(const XamlNode & xamlNode);
	HRESULT PersistValueNode(const XamlNode & xamlNode);

private: 
	xshared_ptr<XamlBinaryMetadataStore> m_spMetadataStore;
	xref_ptr<IPALStream> m_spMetadataStream; 
	xref_ptr<IPALStream> m_spNodeStreamStream;
	XamlLineInfo m_CurrentLineInfo;  
};
